/*
file:	 i386/system/pmjump.s
*/

#include "common/linkage.h"
#include "i386/config.h"
#include "i386/system/segment.h"
#include "i386/processor-flags.h"

	.text
	.code16
/*
*  进入保护模式的入口
*/
GLOBAL(protected_mode_jump)
	/*
	%ebx 将会用来计算新的栈
	*/
	xor	%ebx, %ebx
	mov	%cs, %bx
	shll	$4, %ebx
	add	%ebx, 2f
	/* */
1:	
	movl	%cr0, %edx
	orb	$X86_CR0_PE, %dl
	movl	%edx, %cr0

	mov	$__BOOT_DS, %cx
	mov	$__BOOT_TSS, %di

	.byte   0x66, 0xea
2:	.long   in_pm32
	.word   __BOOT_CS
	/* jmp */
	// jmp	$__BOOT_CS, $PMENTRY
	
END(protected_mode_jump)


	/*
	从此以后进入保护模式
	*/
	.code32
	.section ".text32", "ax"
	.extern startup_32
GLOBAL(in_pm32)
	/*
	之所以这里写成%ecx， 是由于这里已经使用32bit代码
	通过反汇编你会发现 mov	%cx, %ds的反汇编是mov	%ecx, %ds
	*/
	mov	%ecx, %ds
	mov	%ecx, %es
	mov	%ecx, %fs
	mov	%ecx, %gs
	mov	%ecx, %ss

	addl	%ebx, %esp
	

	/*
	进入kernel
	*/
	jmp	startup_32

.L2:
	jmp	.L2
END(in_pm32)

